#ifndef CHATCLIENT_H
#define CHATCLIENT_H

#include <myhead.h>
#include <thread>

#define N 128       // 消息缓冲区的大小
#define LOGIN   1   // 登录状态
#define CHAT    2   // 聊天状态
#define QUIT    3   // 退出状态

class ChatClient
{
public:
    struct MSG{
        int type;        // 消息类型
        char name[20];   // 用户名
        char text[N];    // 消息内容
        //序列化：将消息结构体转化成二进制数据
        string serialize() const
        {
            string data;
            data.append(reinterpret_cast<const char*>(&type), sizeof(type));   // 序列化消息类型
            data.append(name, sizeof(name));   // 序列化用户名
            data.append(text, sizeof(text));   // 序列化消息内容
            return data;
        }
        //反序列化：将二进制数据转化成消息结构体
        void deserialize(const string& data)
        {
            size_t offset = 0;
            memcpy(&type, data.c_str()+offset, sizeof(type));   // 反序列化消息类型
            offset += sizeof(type);

            memcpy(name, data.c_str()+offset, sizeof(name));   // 反序列化用户名
            offset += sizeof(name);

            memcpy(text, data.c_str()+offset, sizeof(text));   // 反序列化消息内容

        }
    };
private:
    int cfd;        //客户端套接字
    string name;    //客户端名称
    bool running;   //运行状态

    void errLog(const char* msg);                       //错误日志函数
    void sendMsg(int type,const string & text = "");    //发送消息函数
    void recvMsg();                                     //接收消息函数

public:
    ChatClient(const char* ip, int port, const string &name);
    ~ChatClient();

    void run();
};


#endif // CHATCLIENT_H